import time  # 导入 借用  时间模块
import tkinter  #  导入 动画模块
import random



# 自定义类 函数  导入模块下
class Ball():   #自定义 球 类
    def __init__(self,canvas,score,paddle,color):    # 初始化 球 函数
        self.canvas = canvas    # 画布canvas 全局变量 传到 类 函数 内部里面
        self.score = score    # 完成传参
        self.paddle = paddle   # self.paddle  代表 外面的球拍
        self.id = canvas.create_oval(0,0,50,50,fill = color)     # x1,y1,x2,y2 创建一个小球 存到变量self.id=小球
        self.canvas.move(self.id,400,300)   # canvas.move() 移动
        level = [-7,-5,-3,-1,1,3,5,7]
        self.x = 3#random.choice(level)
        self.y = 3#random.choice(level)
        self.hit_bottom = False  # 开关 关上 小球没碰到底部 可以移动
    def draw(self):   #  自定义让小球移动的模块
        self.canvas.move(self.id, self.x, self.y )  #
        pos = self.canvas.coords(self.id)    # 获取小球的坐标  pos = [x1,y1,x2,y2]
        #print(pos)
        # 小球碰到底部  y2 = pos[3]
        if pos[3] >= 600:
            #self.y = -5
            self.hit_bottom = True
        if pos[1] <= 0:
            self.y = 5
        if pos[2] >= 800:
            self.x = -5
        if pos[0] <= 0:
            self.x = 5
        if self.hit_paddle(pos) == True:
            self.y = -5
    def hit_paddle(self,pos):   # 球拍打到小球上  触发函数 让小球 弹起   # 这个函数里 要把小球的坐标 和球拍的坐标 都传进来
        paddle_pos = self.canvas.coords(self.paddle.id)   #  获取外部球拍的坐标 传到了 这个小球函数进来
        if pos[2] >= paddle_pos[0] and  paddle_pos[2] >= pos[0]:   # 先满足水平方向
            if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:  #  移动的状态,  临界状态, 满足垂直方向
                self.score.hit()# 调用 加分函数   上面判断打到小球了
                self.x = self.x + self.paddle.x   # 球拍的速度 叠加小球的速度 最后赋值给小球 最终的小球的速度
                return True
        return False
class Paddle():   #自定义 球拍 类
    def __init__(self,canvas,color):    # 初始化 球 函数
        self.canvas = canvas    # 画布canvas 全局变量 传到 类 函数 内部里面
        self.id = canvas.create_rectangle(0,0,400,30,fill = color)     # x1,y1,x2,y2 创建一个球拍 存到变量self.id=球拍
        self.canvas.move(self.id,250,500)   # canvas.move() 移动
        self.x = 0
        self.y = 0
        self.canvas.bind_all('<KeyPress-Left>',self.turn_left)  # 监听 左键
        self.canvas.bind_all('<KeyPress-Right>',self.turn_right)
        self.canvas.bind_all('<KeyPress-F1>',self.started)
        self.kaishi = False
    def started(self,evt):
        self.kaishi = True
        canvas.itemconfig(game_start_text, state='hidden')
    def draw(self):   #  自定义让球拍移动的模块
        self.canvas.move(self.id, self.x, self.y )  #
        pos = self.canvas.coords(self.id)    # 获取球拍的坐标  pos = [x1,y1,x2,y2]
        if pos[2] >= 800:
            self.x = -5
        if pos[0] <= 0:
            self.x = 5
    def turn_left(self,evt): # event 事件 evt
        self.x = -5
    def turn_right(self,evt): # event 事件 evt
        self.x = 5

class Score:
    def __init__(self,canvas,color):    # 初始化 球 函数
        self.canvas = canvas
        self.score = 0
        self.id = canvas.create_text(750,50,text = self.score,font =("Arial",30),fill = color)
    def hit(self):
        self.score = self.score + 1
        self.canvas.itemconfig(self.id,text = self.score )  # 根据函数变化 实时更新

tk = tkinter.Tk()   #  实例化   Tk() 自定义类 ，  创建一个动画 tk
tk.title("人生自己写的第一个游戏")   # 给我们的动画 赋予一个标题
canvas = tkinter.Canvas(tk, width = 800, height = 600 )   # 创建一个画布 tk动画
canvas.pack()
paddle = Paddle(canvas,"blue")
score = Score(canvas,"red")
ball = Ball(canvas,score,paddle,"red")
game_over_text = canvas.create_text(400,300,text ="Game Over hehe",font =("Arial",30),state = 'hidden')  #
game_start_text = canvas.create_text(400,300,text ="Press F1 to start the game ",font =("Arial",30))
# 创建 游戏结束提示语   状态改成隐藏
#ball2 = Ball(canvas,"yellow")
#ball3 = Ball(canvas,"grey")
while 1:
    if ball.hit_bottom == False and paddle.kaishi ==True :  # True False 开关
        ball.draw()    # 调用小球移动的函数
        paddle.draw()
    if ball.hit_bottom == True:
        canvas.itemconfig(game_over_text,state = 'normal')
    tk.update()    # 动画刷新
    tk.update_idletasks()  # 动画 任务栏 刷新
    time.sleep(0.01)
